home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / zroutin.com / ZROUTINE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-01-14  |  12.8 KB  |  575 lines

  1. unit ZRoutine;
  2.  
  3. INTERFACE
  4. uses crt,dos;
  5.  
  6. {$IFNDEF NOZINPUT}
  7. const
  8.     ZIEsc = #27;
  9.     ZIF1  = #0 + #59;
  10.     ZIF2  = #0 + #60;
  11.     ZIF3  = #0 + #61;
  12.     ZIF4  = #0 + #62;
  13.     ZIF5  = #0 + #63;
  14.     ZIF6  = #0 + #64;
  15.     ZIF7  = #0 + #65;
  16.     ZIF8  = #0 + #66;
  17.     ZIF9  = #0 + #67;
  18.     ZIF10 = #0 + #68;
  19.  
  20. {$ENDIF}
  21.  
  22.  
  23.  
  24. var
  25.            ZCmd          :  String;   (* Command Buffer *)
  26.        ZSilent : Boolean;   (* Prevents beeping *)
  27.        ZDelay  : integer;   (* for growing windows *)
  28.        ZIOErr  : Boolean;   (* set by ZIOREsult *)
  29.  
  30. {$IFNDEF NOZINPUT}
  31.        ZINumOfFields : integer; (* number of fields being passed *)
  32.  
  33.        ZILen,
  34.        ZICol,
  35.        ZIRow    : array[1..25] of integer;
  36.        ZIData    : array[1..25] of string[80];
  37.        ZIInValid    : array[1..25] of string;
  38.        ZIKeyPressed : string[2];
  39.  
  40. {$ENDIF}
  41.  
  42. Function  ZCmdPos (The_Pos  : Word  ) : string;
  43. Function  ZCmdStr (A_String : String) : string;
  44. Function  ZUCase  (A_String : String) : string;
  45. Function  ZRight(A_String : string; A_Word : Word) : string;
  46. Procedure ZBeep(Number_Of_Times : integer);
  47. Procedure ZPress_any_Key_to_Continue ;
  48. Function  ZLpadint(TheVal : integer; NumOfBytes:Integer) : string;
  49.  
  50. (* - new in version 1.1 *)
  51. Function  ZCmdKeyWord (TheKeyWord : string) : boolean;
  52. Function  ZCmdInt     (A_String: String) : Integer;
  53. Function  ZString (A_String : String; NumOfTimes:Integer) : string;
  54. Procedure ZColor (x,y:integer);
  55. Function  ZPad(A_String, PadString : string; Totlen: integer) : string;
  56. Procedure  ZWrite(x,y: integer;A_String:string);
  57. Procedure ZMakeWindow (Left_Column,   Top_Row,
  58.                             Right_Column,  Bottom_Row: integer;
  59.                             F_Color,        B_Color       : byte;
  60.                             WindowType : Integer                            );
  61.  
  62. procedure ZCsrSize(x,y:integer);
  63. procedure ZCsrNone;
  64. procedure ZCsrBlock;
  65. procedure ZCsrNormal;
  66. procedure ZCsrHalf;
  67. procedure ZShell(TheCommand : string);
  68. procedure ZLTrimp(var A_String : string);
  69. Function  ZLtrim(A_String : string) : string;
  70. procedure ZmakeWindowg (lcol,trow,rcol,brow,fcolor,bcolor,border:integer);
  71.  
  72. Procedure ZIOResult (var An_integer : integer; var The_Message : string);
  73. Function  ZIOCheck  : boolean;
  74. Procedure ZIOVerify;
  75.  
  76. {$IFNDEF NOZINPUT}
  77. Procedure ZInput;
  78. {$ENDIF}
  79.  
  80. Function ZStr (A_number : integer) : string;
  81.  
  82. IMPLEMENTATION
  83.  
  84. Function Zstr (A_number : integer) : string;
  85.  
  86. var
  87.     tempstr : string;
  88.  
  89. begin
  90.     Str(A_Number, Tempstr);
  91.     ZStr := Tempstr;
  92. end;
  93.  
  94.  
  95.  
  96. {$IFNDEF NOZINPUT}
  97. {$I ZINPUT.PAS}
  98. {$ENDIF}
  99.  
  100. Procedure ZIOVerify;
  101. var
  102.     xx : integer;
  103.     yy : string;
  104.  
  105. begin
  106.     ZIOResult (xx,yy);
  107.     if ZIOErr then    begin
  108.             Writeln;
  109.             Writeln('An unexpected I/O error has occurred');
  110.             Writeln(yy);
  111.             Writeln('IO code of ', xx, ' was returned');
  112.             zbeep (3);
  113.             halt(1);
  114.             end;
  115. end;
  116.  
  117. Function ZIOCheck : boolean;
  118. var
  119.     xx : integer;
  120.     yy : string;
  121. begin
  122.     ZIOResult (xx, yy);
  123.     ZIOCheck := ZIOErr;
  124. end;
  125.  
  126. Procedure ZIOResult (var An_Integer : integer; var The_Message : String);
  127. var
  128.     ZIOCode : integer;
  129.  
  130. begin
  131.     ZIOCode := IoResult;
  132.     ZIOErr := (ZIOCode <> 0 );
  133.     An_Integer := 0;
  134.     The_Message := '';
  135.  
  136.     if ZIOErr then begin
  137.  
  138.         An_integer := ZIOCode;
  139.  
  140.         case ZIOCode of
  141.  
  142.         $02 :    The_Message := 'File not found';
  143.         $03 :    The_Message := 'Path not found';
  144.         $04 :    The_message := 'File not Open';
  145.         $10 :    The_message := 'Error in numeric format';
  146.         $20 :    The_message := 'Operation not allowed in logical device';
  147.         $21 :    The_message := 'Not allowed in direct mode';
  148.         $22 :   The_message := 'Assign to standard files not allowed';
  149.         $90 :    The_message := 'Record length mismatch';
  150.         $91 :    The_message := 'Seek beyond end-of-file';
  151.         $99 :    The_message := 'Unexpected end of file';
  152.         $f0 :    The_message := 'Disk Write Error!';
  153.         $f1 :    The_message := 'Directory is full';
  154.         $f2 :    The_message := 'File Size overflow';
  155.         $f3 :    The_message := 'Too many open files';
  156.         $ff :    The_message := 'File disappeared';
  157.         else
  158.             The_message := 'Unknowm I/O Error!';
  159.         end
  160.     end;
  161. end;
  162.  
  163. procedure ZmakeWindowg (lcol,trow,rcol,brow,fcolor,bcolor,border:integer);
  164.  
  165. var tempx, tempy, tempz, tempa, tempb: integer;
  166.     slcol, srcol, strow, sbrow : integer;
  167.  
  168. begin
  169.  
  170.         tempx := rcol - lcol;
  171.         tempy := brow - trow;
  172.  
  173.  
  174.         slcol := tempx div 2 + lcol - 1;
  175.         srcol := rcol - tempx div 2 + 1;
  176.  
  177.         strow := tempy div 2 + trow - 1;
  178.         sbrow := brow - tempy div 2 + 1;
  179.         tempa := tempx div tempy;
  180.  
  181.         if not DirectVideo then
  182.             if (tempx > 12) or (tempy > 4) then
  183.                 tempa := tempa * 4;
  184.  
  185.         repeat
  186.  
  187.             slcol := slcol - tempa;
  188.             strow := strow - 1;
  189.             srcol := srcol + tempa;
  190.             sbrow := sbrow + 1;
  191.  
  192.             if slcol < lcol then slcol := lcol;
  193.             if srcol > rcol then srcol := rcol;
  194.             if strow < trow then strow := trow;
  195.             if sbrow > brow then sbrow := brow;
  196.  
  197.             zmakewindow(slcol, strow, srcol, sbrow, fcolor, bcolor, border);
  198.             delay(ZDelay);
  199.  
  200.  
  201.  
  202.         until (slcol = lcol) and (strow = trow);
  203.         ZMakeWindow (lcol, trow, rcol, brow, fcolor, bcolor, border);
  204. end;
  205.  
  206.  
  207.  
  208.  
  209.  
  210. Function  ZLTrim(A_String : string) : string;
  211. begin
  212.  
  213.     ZLTrimp(A_String);
  214.     ZLTrim := A_String;
  215.  
  216. end;
  217.  
  218.  
  219.  
  220. Procedure ZLTrimp(var A_String : string);
  221.  
  222. begin
  223.     if length(A_String) < 1 then exit;
  224.  
  225.     while A_String[1] = ' ' do
  226.         delete(A_String,1,1);
  227. end;
  228.  
  229.  
  230.  
  231. procedure ZShell(TheCommand : string);
  232. VAR
  233.   Regs : Registers;
  234.  
  235.     Begin;
  236.       SwapVectors;
  237.      Exec(FSearch('COMMAND.COM',GetEnv('PATH')),TheCommand);
  238.       SwapVectors;
  239.     End;
  240.  
  241.  
  242.  
  243.  
  244. Procedure ZWrite (x,y:integer; A_String:string);
  245. begin
  246.         gotoxy(x,y);
  247.         Write(A_String);
  248. end;
  249.  
  250.  
  251. Function  ZPad(A_String, PadString : string; Totlen: integer) : string;
  252. var
  253.         Zint: integer;
  254.  
  255. begin
  256.         if length(A_String) >= Totlen then
  257.                 begin
  258.                 ZPad := copy(A_String, 1, TotLen);
  259.                 exit;
  260.                 end;
  261.  
  262.         ZPad := A_String + ZString(PadString, Totlen);
  263. end;
  264.  
  265.  
  266.  
  267. Procedure ZColor (x,y:integer);
  268. begin
  269.         textcolor (x);
  270.         Textbackground(y);
  271. end;
  272.  
  273. Function  ZString (A_String : String; NumOfTimes:Integer) : string;
  274.  
  275. var tempstr : string;
  276.  
  277. begin
  278.         ZString := ''; TempStr := '';
  279.         if NumOfTimes > 255 then NumOfTimes := 255;
  280.         While NumOfTimes > 0 do
  281.                 begin
  282.                 tempstr := tempstr + A_String;
  283.                 Dec(NumOfTimes);
  284.                 end;
  285.         ZString := TempStr;
  286. end;
  287.  
  288.  
  289.  
  290.  
  291. Function ZCmdInt      (A_String: String) : integer;
  292.  
  293. var
  294.         Zint, Return_code: integer;
  295.  
  296. begin
  297.  
  298.         val  ( ZCmdStr(A_String), Zint, Return_code);
  299.         if Return_code = 0 then
  300.                 ZCmdInt := Zint
  301.         else
  302.                 ZCmdInt := 0;
  303.  
  304.  
  305. end;
  306.  
  307.  
  308. Function  ZCmdKeyWord (TheKeyWord : string) : boolean;
  309. var
  310.         Zint    : integer ;
  311. begin;
  312.         for Zint := 1 to ParamCount do
  313.                 if ZUcase(ParamStr(Zint)) = ZUCase(TheKeyWord) then
  314.                         begin
  315.                         ZCmdKeyword := true;
  316.                         exit;
  317.                         end;
  318.         ZCmdKeyWord := False;
  319. end;
  320.  
  321.  
  322. Function ZCmdStr (A_String : String) : string;
  323. var
  324.         Zint : integer;
  325.         Zok  : Boolean;
  326.         Ztemp: string;
  327.  
  328. begin;
  329.         ZCmdStr := '';
  330.         if (Length(ZCmd) = 0) or  (Length (A_String) = 0) then exit;
  331.  
  332.         Zint := Pos(ZUCase(A_String), ZUCase(ZCmd)) ;
  333.         If Zint = 0 then exit;
  334.         if (Zint + length(A_String)) > Length(ZCmd) then exit;
  335.  
  336.         Zint := Zint + length(A_String); Zok := True; ZTemp := '';
  337.         while Zok do
  338.                 begin
  339.                         case ZCmd[Zint] of
  340.                                 ' ', '/'        :       Zok := False;
  341.                         else
  342.                                 Ztemp := Ztemp + ZCmd[Zint];
  343.                         end;
  344.  
  345.                 Zint := Zint + 1;
  346.                 if Zint > Length(ZCmd) then Zok := False;
  347.  
  348.                 end;
  349.  
  350.         ZCmdStr := Ztemp;
  351.  
  352. end;
  353.  
  354.  
  355. Function ZUCase  (A_String : String) : string;
  356. var
  357.         ZIndex: Integer;
  358.  
  359. begin
  360.  
  361.         for ZIndex := 1 to length(A_String) do
  362.                 A_String[ZIndex] := upcase(A_String[ZIndex]);
  363.                 ZUcase := A_String;
  364. end; { ZUcase }
  365.  
  366. Function ZCmdPos (The_Pos: Word) : string;
  367.  
  368. var ZInt, ZCount : integer;
  369.         ZTemp : string;
  370.  
  371. begin;
  372.         ZCount := 0;
  373.         ZCmdPos := '';
  374.         For Zint := 1 to ParamCount do
  375.                 begin
  376.  
  377.                 ZTemp := ParamStr(Zint);
  378.                 if ZTemp[1] = '/' then else
  379.                         ZCount := ZCount + 1;
  380.  
  381.                 if ZCount = The_Pos then
  382.                         begin
  383.                         ZCmdPos := ParamStr(Zint);
  384.                         exit
  385.                         end;
  386.                 end;
  387. end;
  388.  
  389.  
  390. function ZRight(A_String : string; A_Word : Word) : string;
  391.  
  392. begin
  393.  
  394.         if A_Word >= Length(A_String) then
  395.                 begin
  396.                 ZRight := A_String;
  397.                 exit;
  398.                 end;
  399.  
  400.         ZRight := copy(A_String, Length(A_String) - A_Word + 1, A_Word);
  401. end;
  402.  
  403.  
  404. procedure ZBeep (Number_Of_Times : integer );
  405.  
  406. begin
  407.            If ZSilent then exit;
  408.         if Number_Of_Times < 1 then Number_Of_Times := 1;
  409.  
  410.         repeat
  411.                 sound (900);
  412.                 delay (250);
  413.                 nosound;
  414.                 Number_Of_Times := Number_Of_Times - 1;
  415.  
  416.         until Number_Of_Times < 1;
  417. end;
  418.  
  419.  
  420. procedure ZPress_any_key_to_continue;
  421.  
  422. var
  423.     throw_away : string[1];
  424.     x,y        : integer;
  425. begin
  426.  
  427.     while keypressed do throw_away := ReadKey;
  428.     x := Wherex;
  429.     y := wherey;
  430.  
  431.         Write('Press any key to continue...');
  432.            ZBeep (2);
  433.  
  434.         throw_away := '';
  435.  
  436.         while throw_away = '' do
  437.                 Throw_Away := ReadKey;
  438.  
  439.     gotoXY (x,y);
  440.     Write(ZString(' ',28));
  441.  
  442.     if throw_away = #27 then
  443.         begin
  444.         ZCsrNormal;
  445.         halt(0);
  446.         end;
  447. end;
  448.  
  449.  
  450. function ZLpadint(TheVal : integer; NumOfBytes:Integer) : string;
  451.  
  452. var
  453.         TempStr : string;
  454.  
  455. begin
  456.  
  457.         STR(TheVal : NumOfBytes, TempStr);
  458.         while pos(' ', TempStr) > 0 do
  459.                 TempStr[Pos(' ', TempStr)] := '0';
  460.  
  461.         ZLPadint := TempStr;
  462. end;
  463.  
  464.  
  465.  
  466. procedure ZCsrNone;
  467. begin
  468.         ZCsrSize(32,0);
  469. end;
  470.  
  471. procedure ZCsrBlock;
  472. begin
  473.         ZCsrSize(0,7);
  474. end;
  475.  
  476. procedure ZCsrNormal;
  477. begin
  478.         ZCsrSize(6,7);
  479. end;
  480.  
  481. procedure ZCsrHalf;
  482. begin
  483.         ZCsrSize(4,7);
  484. end;
  485.  
  486.  
  487.  
  488. Procedure ZMakeWindow (Left_Column,   Top_Row,
  489.                             Right_Column,  Bottom_Row: integer;
  490.                             F_Color,        B_Color       : byte;
  491.                             WindowType : Integer                            );
  492.  
  493.  
  494. var
  495.         Themid: string[77];
  496.         ZWLeftUpper, ZWAcross, ZWRightUpper, ZWLeft, ZWRightBottom, ZWLeftBottom : char;
  497.  
  498.  
  499. begin
  500.         Case WindowType of
  501.                 2:      begin
  502.                         ZWLeftUpper     := #213;
  503.                         ZwAcross       := #205;
  504.                         ZwRightUpper    := #184;
  505.                         ZwLeft          := #179;
  506.                         Zwrightbottom   := #190;
  507.                         ZWleftBottom    := #212;
  508.                         end;
  509.  
  510.                 else begin;
  511.                         ZWLeftUpper     := #201;
  512.                         ZwAcross       := #205;
  513.                         ZwRightUpper    := #187;
  514.                         ZwLeft          := #186;
  515.                         Zwrightbottom   := #188;
  516.                         ZWleftBottom    := #200;
  517.                         end;
  518.                 end;
  519.  
  520.  
  521.  
  522.  
  523.         gotoxy (Left_Column, Top_Row);
  524.         Textcolor(F_Color); TextBackground(B_Color);
  525.  
  526.         Write(' ',ZWLeftUpper, Zstring(ZWAcross, Right_Column - Left_Column - 3), ZWRightUpper,' ');
  527.         Inc(Top_Row);
  528.  
  529.         TheMid := ZString(' ', Right_Column - Left_Column - 3);
  530.  
  531.         While Top_Row < Bottom_Row do
  532.                 begin
  533.                 gotoxy(Left_Column, Top_Row);
  534.                 Write(' ',ZWLeft, TheMid, ZWLeft,' ');
  535.                 Top_Row := Top_Row + 1;
  536.                 end;
  537.                 gotoxy(Left_Column, Top_Row);
  538.  
  539.         Write(' ',ZWLeftBottom, Zstring(ZWAcross, Right_Column - Left_Column - 3), ZWRightBottom,' ');
  540.  
  541.  
  542.  
  543.  
  544. end;
  545.  
  546.  
  547. procedure ZCsrSize(x,y:integer);
  548. var r: registers;
  549. begin;
  550.         r.ah :=1;
  551.         r.ch :=x;
  552.         r.cl :=y;
  553.         intr ($10,r);
  554. end;
  555.  
  556.  
  557. {-------------------------------------------------------------------
  558.   this code is executed every program using this unit...
  559.   it builds the ZCMD variable for all other functions...}
  560.  
  561.  
  562. var Zint : integer;
  563.  
  564. begin
  565.         ZCmd := '';                               { init the command buffer }
  566.         ZSilent := False;                                    { Sound defaults on }
  567.         ZDelay :=50;
  568.  
  569.         for Zint := 1 to ParamCount do
  570.                 ZCmd := ZCmd + ParamStr(Zint) + ' ';
  571.  
  572.     DirectVideo := not ZCmdKeyWord('BIOS');
  573.  
  574. end.
  575.